package files

import (
	"errors"
	"fmt"
	"time"
	ijson "wails-hertz/server/kits/json"
	istring "wails-hertz/server/kits/strings"
)

type FileDB struct {
	FilePath string
}

type FileRow struct {
	Key        string
	Value      interface{}
	Remark     string
	CreateId   string
	CreateName string
	CreateDate time.Time
	UpdateId   string
	UpdateName string
	UpdateDate time.Time
}

// Load 文件格式 Map[string]FileRow
func (db FileDB) Load() (map[string]FileRow, error) {
	var content, fileErr = ReadFile(db.FilePath)
	if fileErr != nil {
		return nil, errors.New(fmt.Sprintf("DBLoad|Load error:%s", fileErr.Error()))
	}

	var data = map[string]FileRow{}
	if istring.IsEmpty(content) {
		return data, nil
	}
	err := ijson.ParseJson(content, &data)
	if err != nil {
		return nil, errors.New(fmt.Sprintf("DBLoad|Load error:%s", err.Error()))
	}
	return data, nil
}

func (db FileDB) Save(data map[string]FileRow) error {
	content, jsonErr := ijson.ToJsonString(data)
	if jsonErr != nil {
		return errors.New(fmt.Sprintf("DBLoad|Save error:%s", jsonErr.Error()))
	}
	err := WriteFile(db.FilePath, content)
	if err != nil {
		return errors.New(fmt.Sprintf("DBLoad|Save error:%s", err.Error()))
	}
	return nil
}

func (db FileDB) Put(key string, value interface{}, remark string, overrideAll bool) error {
	// 文件Load
	var data map[string]FileRow
	var err error
	if overrideAll {
		data = map[string]FileRow{}
	} else {
		data, err = db.Load()
		if err != nil {
			return errors.New(fmt.Sprintf("DBLoad|Put error:%s", err.Error()))
		}
	}

	// 文件操作
	row := FileRow{Key: key, Value: value, Remark: remark, UpdateDate: time.Now()}
	data[key] = row

	// 文件保存
	saveErr := db.Save(data)
	if saveErr != nil {
		return errors.New(fmt.Sprintf("DBLoad|Put error:%s", saveErr.Error()))
	}
	return nil
}

func (db FileDB) Remove(key string) error {
	// 文件Load
	data, err := db.Load()
	if err != nil {
		return errors.New(fmt.Sprintf("DBLoad|Put error:%s", err.Error()))
	}
	// 文件操作
	delete(data, key)

	// 执行保存
	saveErr := db.Save(data)
	if saveErr != nil {
		return errors.New(fmt.Sprintf("DBLoad|Put error:%s", saveErr.Error()))
	}
	return nil
}
